เชิงมุม 10 | โพสต์ Http | สตริงอาร์เรย์ต่อท้าย FormData

Sep 15 2020

ฉันต้องส่งคำขอโพสต์ไปยังปลายทาง api แต่ได้รับสถานะข้อผิดพลาด 500

name: "HttpErrorResponse"
ok: false
status: 500
statusText: "Internal Server Error"

นี่คือรหัสของฉัน:

var selectedIds = ["31"];
let sendData = new FormData();
sendData.append('auth', this.dataService.REG_AUTH);
sendData.append('identifier', identifier);
sendData.append('selected[]', selectedIds); 

this.http.post<any>('APIENDPOINT', sendData).subscribe(data => {
  console.log(data);
}, error => {  
  console.log(error);
});

ปัญหาอยู่ในบรรทัดนี้: sendData.append('selected[]', selectedIds);ฉันไม่รู้วิธีส่งอาร์เรย์ไปยัง FormData

นี่คือตัวอย่างการทำงานจากแอพ Android ของเรา ฉันต้องการแปลงคำขอนี้เป็นไวยากรณ์เชิงมุม / typescript:

@JvmSuppressWildcards
@FormUrlEncoded
@POST("APIENDPOINT")
fun addData(
    @Field("auth") auth: String,
    @Field("identifier") identifier: String,
    @Field("selected[]") selected: ArrayList<String>
): Call<ResponseBody>

สิ่งที่ฉันรู้จนถึงตอนนี้:

ดูเหมือนว่าเชิงมุมไม่ได้ทำให้ข้อมูลเป็นอนุกรมดังนั้นฉันจึงลองแก้ไขฮาร์ดโค้ด แต่ก็ไม่ได้ผล:

sendData.append('selected%5B%5D', '%2231%22'); 
sendData.append('selected%5B%5D', '31');
sendData.append('selected%5B%5D', 31);
sendData.append('selected%5B%5D', '%5B%2231%22%5D'); 
sendData.append('selected%5B%5D', selectedIds); 
sendData.append('selected%5B%5D', JSON.stringify(selectedIds));

หากฉันใช้selectedแทนselected[]ฉันจะไม่พบข้อผิดพลาด แต่เห็นได้ชัดว่าไม่มีการอัปเดตข้อมูลดังนั้นฉันค่อนข้างมั่นใจว่าเป็นปัญหาการทำให้เป็นอนุกรม / การแยกวิเคราะห์

คำตอบ

2 ForestG Sep 15 2020 at 12:46

จากคำตอบนี้ :

วิธีการ append () ของ FormData สามารถยอมรับเฉพาะวัตถุประเภทสตริงหรือหยด หากคุณต้องการต่อท้ายอาร์เรย์ให้ใช้เมธอด JSON.stringify () เพื่อแปลงอาร์เรย์ของคุณเป็นสตริง JSON ที่ถูกต้อง

formData.append('selected[]', JSON.stringify(selectedIds));
1 ng-hobby Sep 15 2020 at 12:53

นี่statusCode 500คือข้อผิดพลาดภายในเซิร์ฟเวอร์และเป็นปัญหาฝั่งเซิร์ฟเวอร์ ดังนั้นควรตรวจสอบAPIว่าสามารถรับคำขอของคุณได้หรือไม่

append()วิธีการของ FormData ยอมรับstringหรือblobพิมพ์ดังนั้นคุณสามารถใช้JSON.stringify()method ( formData.append('selectedIds', JSON.stringify(selectedIds));) ลองสิ่งนี้:

let selectedIds = ["31"];
let sendData = new FormData();
sendData.append('auth', this.dataService.REG_AUTH);
sendData.append('identifier', identifier);
sendData.append('selectedIds', JSON.stringify(selectedIds)); 

this.http.post<any>('APIENDPOINT', sendData).subscribe(data => {
  console.log(data);
}, error => {  
  console.log(error);
});