我有一个flask应用程序,该应用程序曾经从flutter应用程序中调用过,创建了一些HTML文件并返回了文件名的位置。然后,我的flutter应用程序使用“ webview_flutter”包查看该文件。在本地开发服务器中,这工作得很好。当我将其上传到AWS LAMbda时,我使用一些API密钥保护了应用程序。因此,我的问题是如何立即使用http.post使用此密钥调用此API,然后使用“ webview_flutter软件包”和该api_key查看创建的HTML文件。请帮助我。
使用API密钥和Webview Flutter发布请求
•
问答
gukoule 回答:使用API密钥和Webview Flutter发布请求
AWS LAMbda的第一部分
您可以使用软件包https://pub.dev/packages/amazon_cognito_identity_dart
对API Gateway + Lambda的身份验证访问,请参阅
https://github.com/jonsaw/amazon-cognito-identity-dart/#for-api-gateway--lambda
代码段
public class addproduct extends AppCompatActivity {
RecyclerView recyclerView;
ArrayList<customitem> datalist =new ArrayList<customitem>();
FirebaseDatabase mdatabase;
DatabaseReference mreference;
EditText productname,price,size,b2;
Spinner sizespinner;
Button okbutton;
View mview;
ImageView cancel;
AlertDialog d;
AlertDialog.Builder alert;
recyclerviewadapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_addproduct);
getSupportActionBar().setTitle("Add product");
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
mdatabase = FirebaseDatabase.getInstance();
//?????????????????????? my firebase referance ????????????
mreference = mdatabase.getReference().child("product");
mreference.keepSynced(true);
recyclerView = findViewById(R.id.recyclerviewid);
buildrecyclerview();
//mreference.child("product").setValue(datalist);
}
public void buildrecyclerview(){
adapter = new recyclerviewadapter(datalist);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new GridLayoutManager(this,4));
recyclerView.setAdapter(adapter);
mreference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot dataSnapshot1:dataSnapshot.getChildren()){
customitem j =dataSnapshot1.getValue(customitem.class);
datalist.add(j);
}
adapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
adapter.recyclerviewonclicl(new recyclerviewadapter.vonclick() {
@Override
public void cclick(final int possition) {
//?????????????? alert dilog two for delete and update data ????????????????
AlertDialog.Builder bl = new AlertDialog.Builder(addproduct.this);
View v = getLayoutInflater().inflate(R.layout.manageralertdilogtwo,null);
bl.setView(v);
d=bl.create();
d.show();
final EditText productname2 = v.findViewById(R.id.productname2);
final EditText size2 = v.findViewById(R.id.packsizeid2);
final EditText price2 = v.findViewById(R.id.priceid2);
final EditText box2 = v.findViewById(R.id.Box2);
Button okbtn = v.findViewById(R.id.okbuttonid2);
Button dltbtn = v.findViewById(R.id.deleteid);
ImageView cross =v.findViewById(R.id.cancelid2);
final Spinner sp =v.findViewById(R.id.spinnerid2);
//String pn = datalist.get(possition).getproductname();
productname2.setText(datalist.get(possition).getproductname());
size2.setText(datalist.get(possition).getsize());
price2.setText(datalist.get(possition).getPrice());
box2.setText(datalist.get(possition).getBox());
sp.setSelection(datalist.get(possition).getKg());
cross.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
d.dismiss();
}
});
okbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//?????????????? update data accroding user selectiong ??????????????
//datalist.get(possition).setproductname(productname2.getText().toString());
//datalist.get(possition).setPrice(price2.getText().toString());
//datalist.get(possition).setsize(size2.getText().toString());
//datalist.get(possition).setBox(box2.getText().toString());
//datalist.get(possition).setKg(sp.getSelectedItemPosition());
customitem m = new customitem(productname2.getText().toString(),size2.getText().toString(),price2.getText().toString(),box2.getText().toString(),sp.getSelectedItemPosition());
mreference.child(String.valueOf(datalist.get(possition))).setValue(m);
d.dismiss();
}
});
dltbtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//???????????????? delete data from recycler view accroding user selection ???????????
//datalist.remove(possition);
mreference.child(String.valueOf(datalist.get(possition))).removeValue();
// adapter.notifyDataSetChanged();
d.dismiss();
}
});
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.addproductmenu,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.addproduct:
buildalert();
break;
case R.id.seedetails:
Intent n = new Intent(addproduct.this,managermain.class);
startActivity(n);
break;
}
return super.onOptionsItemSelected(item);
}
public void buildalert(){
//?????? alert dilog one for take data ???????????????
alert = new AlertDialog.Builder(addproduct.this);
mview = getLayoutInflater().inflate(R.layout.manageralertalertdilog,null);
productname = mview.findViewById(R.id.productname);
price = mview.findViewById(R.id.priceid);
alert.setCancelable(true);
size = mview.findViewById(R.id.packsizeid);
cancel = mview.findViewById(R.id.cancelid);
sizespinner = mview.findViewById(R.id.spinnerid);
okbutton = mview.findViewById(R.id.okbuttonid);
b2 = mview.findViewById(R.id.Box);
alert.setView(mview);
final AlertDialog dl = alert.create();
dl.show();
cancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dl.dismiss();
}
});
okbutton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (productnamem() && sizem()){
//add data from alert dilog
String productnm = productname.getText().toString();
String pricec = price.getText().toString();
String sizee = size.getText().toString();
int kg = sizespinner.getSelectedItemPosition();
String box= b2.getText().toString();
//?? add data in recyclerview from alert dilog ???????????????
//datalist.add(new customitem(productnm,sizee,pricec,box,kg));
customitem n = new customitem(productnm,kg);
mreference.child(String.valueOf(datalist.size())).setValue(n);
//adapter.notifyDataSetChanged();
//mreference.setValue(datalist);
dl.dismiss();
}
}
});
}
public boolean productnamem(){
if (productname.getText().toString().trim().isEmpty()){
productname.setError("Please fill it");
productname.setFocusable(true);
return false;
}
else {
return true;
}
}
public boolean sizem(){
if (size.getText().toString().trim().isEmpty()){
size.setError("Please fill it");
size.setFocusable(true);
return false;
}
else {
return true;
}
}
}
webview_flutter负载响应字符串的第二部分
借助webViewController,您可以使用controller.loadUrl
您可以在下面的
复制粘贴运行演示完整代码
代码段
import 'package:http/http.dart' as http;
import 'package:amazon_cognito_identity_dart/cognito.dart';
import 'package:amazon_cognito_identity_dart/sig_v4.dart';
void main() async {
final credentials = new CognitoCredentials(
'ap-southeast-1:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx',userPool);
await credentials.getAwsCredentials(session.getIdToken().getJwtToken());
const endpoint =
'https://xxxx.execute-api.ap-southeast-1.amazonaws.com/dev';
final awsSigV4Client = new AwsSigV4Client(
credentials.accessKeyId,credentials.secretAccessKey,endpoint,sessionToken: credentials.sessionToken,region: 'ap-southeast-1');
final signedRequest = new SigV4Request(awsSigV4Client,method: 'POST',path: '/projects',headers: new Map<String,String>.from(
{'header-1': 'one','header-2': 'two'}),queryParams: new Map<String,String>.from({'tracking': 'x123'}),body: new Map<String,dynamic>.from({'color': 'blue'}));
http.Response response;
try {
response = await http.post(
signedRequest.url,headers: signedRequest.headers,body: signedRequest.body);
} catch (e) {
print(e);
}
print(response.body);
}
工作演示
完整代码
WebView(
initialUrl: 'abc',javascriptMode: JavascriptMode.unrestricted,onWebViewCreated: (WebViewController webViewController) {
_controller = webViewController;
_loadHtmlFromString();
},),_controller.loadUrl( Uri.dataFromString(
fileText,mimeType: 'text/html',encoding: Encoding.getByName('utf-8')
).toString());